/*
 * @Description:
 * @Author: william
 * @Date: 2024-08-08 11:26:27
 * @LastEditors: william
 * @LastEditTime: 2025-09-23 15:21:56
 */
import { resolve } from 'path'
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
// import mkcert from 'vite-plugin-mkcert'
import basicSSL from '@vitejs/plugin-basic-ssl'

import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'

const pathSrc = resolve(__dirname, 'src')
// https://vitejs.dev/config/
export default defineConfig({
  base: './',
  resolve: {
    alias: {
      '@': pathSrc
    }
  },
  server: {
    // 允许IP访问
    host: '0.0.0.0',
    // 应用端口 (默认:5173)
    port: 5174,
    // 运行是否自动打开浏览器
    open: false,
    https: false,
    hmr: {
      warnings: true,
      overlay: true
    },
    proxy: {
      '/rest/cook': {
        target: 'https://iot.neoway.com', // 外网测试
        // target: 'http://192.168.69.11', // 内网测试
        // target: 'http://192.168.114.42:8800', // 小成哥本地服务端口号
        logLevel: 'debug',
        changeOrigin: true
        // rewrite: path => path.replace(/^\/rest\/cook/, '') // 本地调试不需要处理
      }
    }
  },
  plugins: [
    uni(),
    // mkcert(),
    basicSSL(),
    // 自动导入参考： https://github.com/sxzz/element-plus-best-practices/blob/main/vite.config.ts
    AutoImport({
      // 自动导入 Vue 相关函数，如：ref, reactive, toRef 等
      imports: [
        'vue',
        '@vueuse/core',
        'uni-app',
        'vue-i18n',
        'pinia',
        {
          '@/api/index.js': [['apiModules', 'g_api']], // 接口地址模块
          '@/common/optionList.js': [['*', 'g_options']], // 列表选项模块
          '@/common/rules.js': [['*', 'g_rules']], // 表单规则校验模块
          '@/interface/index.js': [['apiInterface', 'g_i']], // 接口模型模块
          '@/lang/index.js': [['default', 'g_i18n'], 'g_t'], // 全局国际化模块
          '@/store/index.js': [['default', 'g_store']], // 状态缓存模块
          '@/utils/http.js': [['http', 'g_http']], // 接口类模块
          '@/utils/index.js': [['*', 'g_utils'], 'getViteImageUrl'], // 公共方法模块
          '@/utils/businessTool.js': [['*', 'g_busTool']] // 业务公共方法模块
        },
        {
          '@/styles/global.module.scss': [['default', 'g_style']] // 全局样式
        },
        {
          '@/mixins/backPress.js': ['useBackPress'], // 加载监听实体返回键模块
          '@/utils/_dayjs.js': [['default', 'g_dayjs']], // dayjs日期处理模块
          '@/utils/_lodashEs.js': [['*', 'g_']] // lodash工具函数模块
        }
      ],
      resolvers: [],
      dirs: ['./src/store/modules/**'],
      eslintrc: {
        // 是否自动生成 eslint 规则，建议生成之后设置 false
        enabled: false,
        // 指定自动导入函数 eslint 规则的文件
        filepath: './.eslintrc-auto-import.json',
        globalsPropValue: true
      },
      // 是否在 vue 模板中自动导入
      vueTemplate: true,
      // 指定自动导入函数TS类型声明文件路径 (false:关闭自动生成)
      // dts: false,
      dts: 'src/types/auto-imports.d.ts'
    }),
    Components({
      resolvers: [],
      // 指定自定义组件位置(默认:src/components)
      dirs: ['src/components'],
      // 指定自动导入组件TS类型声明文件路径 (false:关闭自动生成)
      // dts: false,
      dts: 'src/types/components.d.ts'
    }),
    createSvgIconsPlugin({
      // 指定需要缓存的图标文件夹
      iconDirs: [resolve(pathSrc, 'static/svg')],
      // 指定symbolId格式
      symbolId: 'icon-[name]'
    })
  ],
  // 构建配置
  build: {
    sourcemap: false,
    // target: ['es2020', 'edge88', 'firefox78', 'chrome87', 'safari14'], // 以上即不生效=>Top-level await is not available in the configured target environment // es2019/esnext
    outDir: 'dist',
    assetsDir: 'js',
    chunkSizeWarningLimit: 1024, // 消除打包大小超过500kb警告
    minify: 'terser', // Vite 2.6.x 以上需要配置 minify: "terser", terserOptions 才能生效
    terserOptions: {
      compress: {
        keep_infinity: true, // 防止 Infinity 被压缩成 1/0，这可能会导致 Chrome 上的性能问题
        drop_console: true, // 生产环境去除 console
        drop_debugger: true // 生产环境去除 debugger
      },
      format: {
        comments: true // 删除注释
      }
    },
    rollupOptions: {
      treeshake: true, // 开启 Tree Shaking，消除未使用的代码，减小最终的包大小
      output: {
        // manualChunks: {
        //   // app与H5的方式不一样
        //   ...(process.env.UNI_PLATFORM === 'app'
        //     ? {}
        //     : {
        //         'vue-i18n': ['vue-i18n'],
        //         'uview-plus': ['uview-plus'],
        //         '@vueuse-core': ['@vueuse/core'],
        //         'lang-pack': ['./src/lang/index.js'],
        //         api: ['./src/api/index.js']
        //       })
        // },
        // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
        entryFileNames: 'js/[name].[hash].js',
        // 用于命名代码拆分时创建的共享块的输出命名
        chunkFileNames: 'js/[name].[hash].js',
        // 用于输出静态资源的命名，[ext]表示文件扩展名
        assetFileNames: assetInfo => {
          const info = assetInfo.name.split('.')
          let extType = info[info.length - 1]
          if (
            /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)
          ) {
            extType = 'media'
          } else if (/\.(png|jpe?g|gif|svg|ico)(\?.*)?$/.test(assetInfo.name)) {
            extType = 'img'
          } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) {
            extType = 'fonts'
          }
          return `${extType}/[name].[hash].[ext]`
        }
      }
    }
  },
  define: {
    __Admin_VERSION__: JSON.stringify(process.env.npm_package_version), // app的全局版本号-在app中不适用
    __VUE_I18N_FULL_INSTALL__: JSON.stringify(true),
    __VUE_I18N_LEGACY_API__: JSON.stringify(false),
    __INTLIFY_PROD_DEVTOOLS__: JSON.stringify(false)
  }
})
